package com.xjiuge.fruit.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import com.xjiuge.fruit.service.base.BaseServiceImpl;
import com.xjiuge.fruit.bean.Menu;
import com.xjiuge.fruit.bean.User;
import com.xjiuge.fruit.common.ComIdUtil;
import com.xjiuge.fruit.common.ValidateUtil;
import com.xjiuge.fruit.mapper.MenuMapper;
import com.xjiuge.fruit.service.MenuService;

import org.springframework.stereotype.Service;

@Service("menuService")
public class MenuServiceImpl 
    extends BaseServiceImpl<Menu,MenuMapper> 
    implements MenuService {

	@Resource(name = "menuMapper")
	private MenuMapper menuMapper;
	
	/**
	 * 获取部门树集合
	 * SysDeptServiceImpl.getTreeList<BR>
	 * <p>Author:xuhongcheng</p>
	 * <p>Date: 2017年7月11日  下午2:55:32</p>
	 * @return
	 */
	@Override
	public List<Map<String, Object>> getTreeList() {
		List<Map<String, Object>> treeList = new ArrayList<Map<String,Object>>();
		Menu menu = menuMapper.selectRoot();
		List<Menu> menuList = menuMapper.selectAllMenu();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("id", menu.getMenuId());
		map.put("text", menu.getMenuName());
		map.put("state", "open");
		//调用递归方法，生成树数据
		List<Map<String, Object>> childList= recursionFn(menuList, menu);
		if(ValidateUtil.isNotNullForList(childList)){
			map.put("children", childList);
		}
		treeList.add(map);
		return treeList;
	}

    /**
     * 递归获得部门树数据
     * SysDeptServiceImpl.recursionFn<BR>
     * <p>Author:xuhongcheng</p>
     * <p>Date: 2017年7月11日  下午2:53:24</p>
     * @param list 所有的部门集合
     * @param dept 父节点部门
     * @return
     */
   private List<Map<String, Object>> recursionFn(List<Menu> list, Menu menu) {
	   List<Map<String, Object>> treeList = new ArrayList<Map<String,Object>>();
       List<Menu> childList = getChildList(list, menu);// 得到子节点列表
       if (childList.size()>0) {// 判断是否有子节点
	       	for (Menu menu2 : childList) {
	       		Map<String, Object> map = new HashMap<String, Object>();
	       		map.put("id", menu2.getMenuId());
	       		map.put("text", menu2.getMenuName());
	       		List<Map<String, Object>> childlList = recursionFn(list, menu2);
	       		if(ValidateUtil.isNotNullForList(childlList)){
	       			map.put("children", childlList);
	       			map.put("state", "open");
	       		}
	       		treeList.add(map);
			}
       }
       return treeList;
   }
    
   /**
    * 根据父节点得到子节点集合
    * MenuServiceImpl.getChildList<BR>
    * <p>Author:xuhongcheng</p>
    * <p>Date: 2017年11月2日  下午3:43:21</p>
    * @param list 所有菜单集合
    * @param menu 父节点菜单
    * @return
    */
   private List<Menu> getChildList(List<Menu> list, Menu menu) {
   	List<Menu> menuList = new ArrayList<Menu>();
       Iterator<Menu> it = list.iterator();
       while (it.hasNext()) {
    	   Menu menu2 = (Menu) it.next();
           if (menu2.getParentId()!=null && menu2.getParentId().equals(menu.getMenuId())) {
        	   menuList.add(menu2);
           }
       }
       return menuList;
   }

   	/**
   	 * 添加菜单
   	 * MenuServiceImpl.save<BR>
   	 * <p>Author:xuhongcheng</p>
   	 * <p>Date: 2017年11月2日  下午3:54:01</p>
   	 * @param menu
   	 * @param loginUser
   	 */
	@Override
	public void save(Menu menu, User loginUser) {
		menu.setMenuId(ComIdUtil.getUUID());
		menu.setCreaterId(loginUser.getUserId());
		menu.setCreaterName(loginUser.getUserName());
		menu.setCreateTime(new Date());
		menuMapper.insertSelective(menu);
	}

	/**
	 * 通过父ID查询子节点集合
	 * MenuServiceImpl.selectMenuListByPid<BR>
	 * <p>Author:xuhongcheng</p>
	 * <p>Date: 2017年11月3日  下午1:56:49</p>
	 * @return
	 */
	@Override
	public List<Menu> selectMenuListByPid(String parentId) {
		
		return menuMapper.selectMenuListByPid(parentId);
	}

	/**
	 * 批量删除菜单
	 * MenuServiceImpl.deleteByIds<BR>
	 * <p>Author:xuhongcheng</p>
	 * <p>Date: 2017年11月3日  下午5:01:36</p>
	 * @param ids
	 */
	@Override
	public void deleteByIds(String[] ids) {
		menuMapper.deleteByIds(ids);
	}

	/**
	 * 编辑菜单
	 * MenuServiceImpl.update<BR>
	 * <p>Author:xuhongcheng</p>
	 * <p>Date: 2017年11月6日  上午11:18:16</p>
	 * @param menu
	 * @param user
	 */
	@Override
	public void update(Menu menu, User user) {
		menu.setModifierId(user.getUserId());
		menu.setModifierName(user.getUserName());
		menu.setModifierTime(new Date());
		menuMapper.updateByPrimaryKeySelective(menu);
	}

	/**
	 * 获取角色权限
	 * MenuServiceImpl.auth<BR>
	 * <p>Author:xuhongcheng</p>
	 * <p>Date: 2017年11月6日  下午3:06:46</p>
	 * @return
	 */
	@Override
	public List<Map<String, Object>> auth() {
		Menu root= menuMapper.selectRoot();
		List<Map<String, Object>> list = new ArrayList<>();
		List<Menu> menuList = menuMapper.selectMenuListByPid(root.getMenuId());
		for (Menu menu2 : menuList) {
			Map<String, Object> map = new HashMap<>();
			map.put("id", menu2.getMenuId());
			map.put("text", menu2.getMenuName());
			list.add(map);
		}
		return list;
	}

}